# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-08-10
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================
from 神笔码靓.神笔库 import 神笔模板, 神笔绘图板
from 神笔码靓.神笔库.线条工具集 import *
from 神笔码靓.神笔库.通用工具集 import *


class 头像模板工具(神笔绘图板):
    def 画垂直参考线(self, x1, y1, y2, 说明):
        self.画垂直线(x1=x1, y1=y1, y2=y2, 描边样式="3,3").添加到列表(self.组列表)
        self.写字(x=x1, y=y1, 文字=说明, 字体大小=10,
                水平基线对齐=文字水平基线对齐.起始点对齐).平移(-5, 8).旋转(90).字旋转(-90).添加到列表(self.组列表)

    def 画垂水平考线(self, x1, y1, x2, 说明):
        self.画水平线(x1=x1, y1=y1, x2=x2, 描边样式="3,3").添加到列表(self.组列表)
        self.写字(x=x1, y=y1, 文字=说明, 字体大小=10,
                水平基线对齐=文字水平基线对齐.起始点对齐, 垂直基线对齐=文字垂直基线对齐.顶线对齐).添加到列表(self.组列表)

    def 画矩形参考线(self, x, y, 宽, 高, 说明):
        self.画矩形(x=x, y=y, 宽=宽, 高=高, 描边样式="3,3", 圆角半径=5).添加到列表(self.组列表)
        self.写字(x=x + 宽 / 2, y=y + 高 / 2, 文字=说明,
                字体大小=10, 水平基线对齐=文字水平基线对齐.起始点对齐,
                垂直基线对齐=文字垂直基线对齐.顶线对齐).添加到列表(self.组列表)

    def 画圆形参考区(self, x, y, 半径x, 半径y, 说明):
        self.画椭圆(x=x, y=y, 半径=(半径x, 半径y), 描边样式="3,3").添加到列表(self.组列表)
        self.写字(x=x, y=y, 文字=说明, 字体大小=10).添加到列表(self.组列表)

    def 创作(self):
        self.组列表 = 列表()
        组列表 = self.组列表

        宽, 高 = self.宽, self.高
        self.画矩形(x=0, y=0, 宽=宽, 高=高).添加到列表(组列表)
        图片 = 资源库目录(f"素材/漫画卡通/头像/女/头发01.svg")
        self.SVG贴图(x=0, y=0, 图片文件=图片)

        # 画垂水平考线(神笔, x1=0, y1=高 / 2, x2=宽, 名称="中间")
        self.画垂直参考线(x1=宽 / 2, y1=0, y2=高, 说明="中间")

        眼睛宽 = 120
        self.画矩形参考线(x=(宽 - 眼睛宽) / 2, y=高 / 2.15, 宽=眼睛宽, 高=28, 说明="眼睛")
        # 画垂水平考线(神笔, x1=0, y1=高 / 2.05, x2=宽, 说明="眼睛")

        眉毛宽 = 120
        self.画矩形参考线(x=(宽 - 眉毛宽) / 2, y=高 / 2.7, 宽=眉毛宽, 高=28, 说明="眉毛")
        # 画垂水平考线(神笔, x1=0, y1=高 / 2.4, x2=宽, 说明="眉毛")

        鼻子宽 = 35
        self.画矩形参考线(x=(宽 - 鼻子宽) / 2, y=高 / 1.78, 宽=鼻子宽, 高=28, 说明="鼻子")
        # 画垂水平考线(神笔, x1=0, y1=高 / 1.65, x2=宽, 说明="鼻子")

        嘴巴宽 = 45
        self.画矩形参考线(x=(宽 - 嘴巴宽) / 2, y=高 / 1.52, 宽=嘴巴宽, 高=10, 说明="嘴巴")
        # 画垂水平考线(神笔, x1=0, y1=高 / 1.48, x2=宽, 说明="嘴巴")

        下巴宽 = 80
        self.画垂水平考线(x1=(宽 - 下巴宽) / 2, y1=高 / 1.29, x2=(宽 - 下巴宽) / 2 + 下巴宽, 说明="下巴")
        # 神笔.神笔模板("头像").创造元素(id_="头像")

        self.画圆形参考区(x=宽 / 2, y=高 / 2.1, 半径x=85, 半径y=95, 说明="面部")

        self.画圆形参考区(x=宽 / 1.3, y=高 / 1.9, 半径x=20, 半径y=25, 说明="耳朵")
        self.画圆形参考区(x=宽 / 4.3, y=高 / 1.9, 半径x=20, 半径y=25, 说明="耳朵")

        self.创建组合(元素列表=组列表, id_="参考线")


def 获取已有头像部件列表(部件名称, 性别=None):
    from 神笔码靓.码靓库.头像.元素神笔模板 import 头像元素神笔模板
    头像根目录 = 资源库目录(头像元素神笔模板.头像根目录)
    if 性别 is not None:
        头像根目录 = os.path.join(头像根目录, 性别)
    if 部件名称 == "眼镜":
        部件名称 = [部件名称, "派对眼罩"]
    else:
        部件名称 = [部件名称]
    部件名称列表 = 列表()
    for fd in os.listdir(头像根目录):
        if not fd.endswith(".svg"):
            continue
        if any([部件名 in fd for 部件名 in 部件名称]):
            # if 性别 is not None:
            #     部件 = f"{性别}/{fd[:-4]}"
            # else:
            部件 = fd[:-4]
            部件名称列表.添加元素(部件)
    部件名称列表 = sorted(部件名称列表)
    return 部件名称列表


def 获取头发列表(性别):
    return 获取已有头像部件列表("头发", 性别=性别)


def 获取上身列表(性别):
    return 获取已有头像部件列表("上身", 性别=性别)


def 获取胡须列表():
    return 获取已有头像部件列表("胡须", 性别="男")

def 获取眼睛列表(性别):
    return 获取已有头像部件列表("眼睛", 性别=性别)

def 获取眼镜列表():
    return 获取已有头像部件列表("眼镜")


def 获取帽子列表():
    return 获取已有头像部件列表("帽子")


def 头像文件定义生成():
    """

    :return:
    """
    template = """# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :#{date}
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================
from 神笔码靓.码靓库.头像.头像颜色定义 import 常见肤色
from 神笔码靓.神笔库.定义集 import *


#{code}@dataclass
class 头像部件微调:
    # 部件名: str = "眼睛"
    上下: float = 0  # 上负下正
    左右: float = 0  # 左负右正
    旋转: float = 0  # 顺正逆负
    缩放: [float, tuple[float, float]] = 1.0  # 缩小放大，1.0不变
    水平翻转: bool = 否
    垂直翻转: bool = 否


@dataclass
class 头像部件配置:
    性别: str = "女"
    肤色: str = 常见肤色.黄色
    面部: str = "面部01"
    眼睛: str = "眼睛01"
    鼻子: str = "鼻子01"
    胡须: [str, None] = None
    胡须颜色: str = 颜色.黑色
    耳朵: str = "耳朵01"
    头发: str = "头发01"
    头发颜色: str = 颜色.黑色
    眉毛: str = "眉毛01"
    眉毛颜色: str = 颜色.黑色
    嘴巴: str = "嘴巴01"
    上身: str = "上身01"
    眼镜: [str, None] = None
    帽子: [str, None] = None
    眼镜在头发前: bool = 否
    显示边框: bool = 否
    _面部微调: [头像部件微调, None] = None
    _眼睛微调: [头像部件微调, None] = None
    _鼻子微调: [头像部件微调, None] = None
    _胡须微调: [头像部件微调, None] = None
    _耳朵微调: [头像部件微调, None] = None
    _头发微调: [头像部件微调, None] = None
    _眉毛微调: [头像部件微调, None] = None
    _嘴巴微调: [头像部件微调, None] = None
    _上身微调: [头像部件微调, None] = None
    _眼镜微调: [头像部件微调, None] = None
    _帽子微调: [头像部件微调, None] = None

    def 微调帽子(self, 上下=0, 左右=0, 旋转=0, 缩放: [float, tuple[float, float]] = 1, 水平翻转: bool = 否, 垂直翻转: bool = 否):
        self._帽子微调 = 头像部件微调(上下=上下, 左右=左右, 旋转=旋转, 缩放=缩放, 水平翻转=水平翻转, 垂直翻转=垂直翻转)

    @property
    def 帽子微调(self):
        return self._帽子微调

    def 微调面部(self, 上下=0, 左右=0, 旋转=0, 缩放: [float, tuple[float, float]] = 1, 水平翻转: bool = 否, 垂直翻转: bool = 否):
        self._面部微调 = 头像部件微调(上下=上下, 左右=左右, 旋转=旋转, 缩放=缩放, 水平翻转=水平翻转, 垂直翻转=垂直翻转)

    @property
    def 面部微调(self):
        return self._面部微调

    def 微调眼睛(self, 上下=0, 左右=0, 旋转=0, 缩放: [float, tuple[float, float]] = 1, 水平翻转: bool = 否, 垂直翻转: bool = 否):
        self._眼睛微调 = 头像部件微调(上下=上下, 左右=左右, 旋转=旋转, 缩放=缩放, 水平翻转=水平翻转, 垂直翻转=垂直翻转)

    @property
    def 眼睛微调(self):
        return self._眼睛微调

    def 微调鼻子(self, 上下=0, 左右=0, 旋转=0, 缩放: [float, tuple[float, float]] = 1, 水平翻转: bool = 否, 垂直翻转: bool = 否):
        self._鼻子微调 = 头像部件微调(上下=上下, 左右=左右, 旋转=旋转, 缩放=缩放, 水平翻转=水平翻转, 垂直翻转=垂直翻转)

    @property
    def 鼻子微调(self):
        return self._鼻子微调

    def 微调胡须(self, 上下=0, 左右=0, 旋转=0, 缩放: [float, tuple[float, float]] = 1, 水平翻转: bool = 否, 垂直翻转: bool = 否):
        self._胡须微调 = 头像部件微调(上下=上下, 左右=左右, 旋转=旋转, 缩放=缩放, 水平翻转=水平翻转, 垂直翻转=垂直翻转)

    @property
    def 胡须微调(self):
        return self._胡须微调

    def 微调耳朵(self, 上下=0, 左右=0, 旋转=0, 缩放: [float, tuple[float, float]] = 1, 水平翻转: bool = 否, 垂直翻转: bool = 否):
        self._耳朵微调 = 头像部件微调(上下=上下, 左右=左右, 旋转=旋转, 缩放=缩放, 水平翻转=水平翻转, 垂直翻转=垂直翻转)

    @property
    def 耳朵微调(self):
        return self._耳朵微调

    def 微调头发(self, 上下=0, 左右=0, 旋转=0, 缩放: [float, tuple[float, float]] = 1, 水平翻转: bool = 否, 垂直翻转: bool = 否):
        self._头发微调 = 头像部件微调(上下=上下, 左右=左右, 旋转=旋转, 缩放=缩放, 水平翻转=水平翻转, 垂直翻转=垂直翻转)

    @property
    def 头发微调(self):
        return self._头发微调

    def 微调眉毛(self, 上下=0, 左右=0, 旋转=0, 缩放: [float, tuple[float, float]] = 1, 水平翻转: bool = 否, 垂直翻转: bool = 否):
        self._眉毛微调 = 头像部件微调(上下=上下, 左右=左右, 旋转=旋转, 缩放=缩放, 水平翻转=水平翻转, 垂直翻转=垂直翻转)

    @property
    def 眉毛微调(self):
        return self._眉毛微调

    def 微调嘴巴(self, 上下=0, 左右=0, 旋转=0, 缩放: [float, tuple[float, float]] = 1, 水平翻转: bool = 否, 垂直翻转: bool = 否):
        self._嘴巴微调 = 头像部件微调(上下=上下, 左右=左右, 旋转=旋转, 缩放=缩放, 水平翻转=水平翻转, 垂直翻转=垂直翻转)

    @property
    def 嘴巴微调(self):
        return self._嘴巴微调

    def 微调上身(self, 上下=0, 左右=0, 旋转=0, 缩放: [float, tuple[float, float]] = 1, 水平翻转: bool = 否, 垂直翻转: bool = 否):
        self._上身微调 = 头像部件微调(上下=上下, 左右=左右, 旋转=旋转, 缩放=缩放, 水平翻转=水平翻转, 垂直翻转=垂直翻转)

    @property
    def 上身微调(self):
        return self._上身微调

    def 微调眼镜(self, 上下=0, 左右=0, 旋转=0, 缩放: [float, tuple[float, float]] = 1, 水平翻转: bool = 否, 垂直翻转: bool = 否):
        self._眼镜微调 = 头像部件微调(上下=上下, 左右=左右, 旋转=旋转, 缩放=缩放, 水平翻转=水平翻转, 垂直翻转=垂直翻转)

    @property
    def 眼镜微调(self):
        return self._眼镜微调


if __name__ == '__main__':
    部件配置 = 头像部件配置(性别="男", 面部="面部01", 眼睛="眼睛01", 鼻子="鼻子01", 胡须=None, 胡须颜色=颜色.黑色, 耳朵="耳朵01",
                  头发="头发01", 头发颜色=颜色.黑色, 眉毛="眉毛01", 眉毛颜色=颜色.黑色, 嘴巴="嘴巴01", 上身="上身01", 眼镜=None)
    部件微调 = 头像部件微调(上下=0, 左右=0, 旋转=0, 缩放=1.0)
    部件配置.微调面部(0, 1, 2, 3)
    print(部件配置.面部微调)

"""

    #   头发文件 = self.获取参数("", "头发03")
    #         面部文件 = self.获取参数("面部", "面部01")
    #         眼睛文件 = self.获取参数("眼睛", "眼睛01")
    #         眼镜文件 = self.获取参数("眼镜", None)
    #         眼镜在头发前 = self.获取参数("眼镜在头发前", False)
    #
    #         胡须文件 = self.获取参数("胡须", None)
    #         眉毛文件 = self.获取参数("眉毛", "眉毛01")
    #         鼻子文件 = self.获取参数("鼻子", "鼻子01")
    #         嘴巴文件 = self.获取参数("嘴巴", "嘴巴01")
    #         上身文件 = self.获取参数("上身", "上身01")
    #
    #         耳朵文件 = self.获取参数("耳朵", "耳朵01")
    #         头发颜色 = self.获取参数("头发颜色", None)
    #         胡须颜色 = self.获取参数("胡须颜色", None)
    #         眉毛颜色 = self.获取参数("眉毛颜色", None)
    #         后发颜色 = self.获取参数("后发颜色", None)
    #         后发文件 = self.获取参数("后发", None)
    #         性别 = self.获取参数("性别", "女")
    缩进 = "    "
    code = ""
    部件列表 = [
        ("眼睛", "女"), ("眼睛", "男"),
        ("头发", "女"), ("头发", "男"),
        ("面部", "女"), ("面部", "男"),
        ("眉毛", "女"), ("眉毛", "男"),
        ("嘴巴", "女"), ("嘴巴", "男"),
        ("上身", "女"), ("上身", "男"),
        ("鼻子", "女"), ("鼻子", "男"),
        ("胡须", "男"),
        ("耳朵", ""), ("眼镜", ""),("帽子", ""),
    ]

    for 部件名称, 性别 in 部件列表:
        code += f"class {性别}{部件名称}:\n"
        for c in 获取已有头像部件列表(部件名称, 性别):
            code += f'{缩进}{c} = "{c}"\n'
        code += "\n\n"

    from datetime import datetime

    # 获取当前日期和时间
    now = datetime.now()

    # 格式化为中国常用的格式，例如：2023年10月5日 14:30:00
    formatted_time = now.strftime("%Y-%m-%d")

    with open("头像文件定义.py", mode="w+", encoding="utf-8") as f:
        f.writelines(template.replace("#{code}", code).replace("#{date}", formatted_time))


if __name__ == '__main__':
    # 头像模板工具("头像模板参考线.svg", 宽=320, 高=320).完成()

    头像文件定义生成()
